package cn.mdmm.service.impl.weixin;

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.weixin.api.WxMessage;
import com.weixin.core.TokenFactory;

import cn.mdmm.entity.weixin.WxAccountConfigModel;
import cn.mdmm.entity.weixin.WxAccountInfoModel;
import cn.mdmm.entity.weixin.WxAccountReplyKeywordsModel;
import cn.mdmm.entity.weixin.WxAccountReplyMsgModel;
import cn.mdmm.entity.weixin.WxAccountReplyRoleModel;
import cn.mdmm.mapper.weixin.WxAccountInfoMapper;
import cn.mdmm.mapper.weixin.WxAccountReplyRoleMapper;
import cn.mdmm.service.weixin.WxAccountConfigService;
import cn.mdmm.service.weixin.WxAccountReplyKeywordsService;
import cn.mdmm.service.weixin.WxAccountReplyMsgService;
import cn.mdmm.service.weixin.WxAccountReplyRoleService;
import cn.modoumama.service.base.impl.BaseServiceImpl;

/**
 * 类名称：WxAccountReplyRole对象定义<br>
 * 类描述：微信公众号关键字回复匹配规则表业务实现类<br>
 * 类生产方式：工具自动生成代码<br>
 * 创建人：dengqiang<br>
 * 创建时间：2017-07-05 10:15:00<br>
 * 修改人： <br>
 * 修改时间：<br>
 * 修改备注：<br>
 * 
 * @version V1.0
 */

@Service
public class WxAccountReplyRoleServiceImpl extends BaseServiceImpl<WxAccountReplyRoleModel, Integer>
		implements WxAccountReplyRoleService {
	Logger logger = LoggerFactory.getLogger(getClass());

	@Autowired
	public void setGenericMapper(WxAccountReplyRoleMapper genericMapper) {
		super.setGenericMapper(genericMapper);
	}

	@Autowired
	WxAccountReplyRoleMapper currMapper;
	@Autowired
	WxAccountInfoMapper wxAccountInfoMapper;
	@Autowired
	WxAccountReplyMsgService wxAccountReplyMsgService;
	@Autowired
	WxAccountReplyKeywordsService wxAccountReplyKeywordsService;
	@Autowired
	WxAccountConfigService wxAccountConfigService;

	// ------------------请在此添加自定义方法（开始）------------------

	@Override
	public void cleanWxAccountMsg(Integer id) {
		currMapper.cleanWxAccountMsg(id);
	}

	@Override
	public Integer initAutoMsg(WxAccountInfoModel wxAccountInfoModel) {
		logger.info("初始化公众号{}自动回复开始", wxAccountInfoModel.getAccountNo());

		Integer wxAccountId = wxAccountInfoModel.getId();
		logger.info("清空化公众号{}自动回复", wxAccountInfoModel.getAccountNo());
		cleanWxAccountMsg(wxAccountId);

		String autoMsgStr = WxMessage.getAutoreply(TokenFactory.getWxConfig(wxAccountInfoModel.getAccountNo()));
		WxAccountConfigModel wxAccountConfigModel = new WxAccountConfigModel();
		wxAccountConfigModel.setWxAccountId(wxAccountId);
		wxAccountConfigModel.setDateType(2);
		wxAccountConfigModel.setDateJson(autoMsgStr);
		wxAccountConfigService.insert(wxAccountConfigModel);
		JSONObject autoMsg = JSON.parseObject(autoMsgStr);

		Integer isAutoreplyOpen = initAutoMsg(wxAccountInfoModel.getId(), autoMsg);

		logger.info("初始化公众号{}自动回复结束", wxAccountInfoModel.getAccountNo());
		
		return isAutoreplyOpen;

	}

	// ------------------请在此添加自定义方法（结束）------------------

	/**
	 * 保存自动回复,消息自动回复是否开启<br>
	 * <br>  
	 * 创建人：邓强   <br>
	 * 创建时间：2017年10月31日 下午3:42:48    <br> 
	 * 修改人：  <br>
	 * 修改时间：2017年10月31日 下午3:42:48   <br>  
	 * 修改备注：     <br> 
	 * @param wx_id
	 * @param autoMsg
	 * @return  0代表未开启，1代表开启
	 */
	private Integer initAutoMsg(Integer wx_id, JSONObject autoMsg) {
		logger.info("自动回复：{}", autoMsg);

		// 关注回复
		Integer is_add_friend_reply_open = autoMsg.getInteger("is_add_friend_reply_open");
		if (is_add_friend_reply_open > 0) {
			// 关注自动回复
			JSONObject add_friend_autoreply_info = (JSONObject) autoMsg.get("add_friend_autoreply_info");
			String autoreply_type = (String) add_friend_autoreply_info.get("type");
			String autoreply_content = (String) add_friend_autoreply_info.get("content");
			WxAccountReplyMsgModel add_friend_autoreply_model = new WxAccountReplyMsgModel();
			add_friend_autoreply_model.setWxAccountId(wx_id);
			add_friend_autoreply_model.setType(1);
			add_friend_autoreply_model.setMsgType(autoreply_type);
			add_friend_autoreply_model.setContent(autoreply_content);
			add_friend_autoreply_model.setCreateTime(new Date());
			wxAccountReplyMsgService.insert(add_friend_autoreply_model);
		}

		// 普通消息自动回复
		JSONObject message_default_autoreply_info = (JSONObject) autoMsg.get("message_default_autoreply_info");
		if (message_default_autoreply_info != null) {
			String default_type = (String) message_default_autoreply_info.get("type");
			String default_content = (String) message_default_autoreply_info.get("content");
			WxAccountReplyMsgModel message_default_autoreply_model = new WxAccountReplyMsgModel();
			message_default_autoreply_model.setWxAccountId(wx_id);
			message_default_autoreply_model.setType(2);
			message_default_autoreply_model.setMsgType(default_type);
			message_default_autoreply_model.setContent(default_content);
			message_default_autoreply_model.setCreateTime(new Date());
			wxAccountReplyMsgService.insert(message_default_autoreply_model);
		}

		// 关键字自动回复
		JSONObject keyword_autoreply_info = (JSONObject) autoMsg.get("keyword_autoreply_info");
		if (keyword_autoreply_info != null) {
			JSONArray keyword_reply_list = keyword_autoreply_info.getJSONArray("list");
			for (Object item : keyword_reply_list) {
				JSONObject object = (JSONObject) item;
				// 回复名称
				String rule_name = object.getString("rule_name");
				// 回复模式，reply_all代表全部回复，random_one代表随机回复其中一条
				String reply_mode = object.getString("reply_mode");
				// 创建时间
				Date date = object.getDate("create_time");
				// 插入规则信息
				WxAccountReplyRoleModel accountReplyRoleModel = new WxAccountReplyRoleModel();
				accountReplyRoleModel.setWxAccountId(wx_id);
				accountReplyRoleModel.setRuleName(rule_name);
				accountReplyRoleModel.setReplyMode(reply_mode);
				accountReplyRoleModel.setCreateTime(date);
				insert(accountReplyRoleModel);
				if (accountReplyRoleModel.getId() != null) {
					JSONArray keyword_list_info = object.getJSONArray("keyword_list_info");
					if (keyword_list_info != null) {
						// 匹配的关键词列表
						for (Object item1 : keyword_list_info) {
							JSONObject keyword = (JSONObject) item1;
							// 关键字类型,text=文本
							String type = keyword.getString("type");
							// 匹配模式，contain代表消息中含有该关键词即可，equal表示消息内容必须和关键词严格相同
							String match_mode = keyword.getString("match_mode");
							// 对于文本类型，content是文本内容，对于图文、图片、语音、视频类型，content是mediaID
							String content = keyword.getString("content");
							// 插入关键字信息
							WxAccountReplyKeywordsModel keywordsModel = new WxAccountReplyKeywordsModel();
							keywordsModel.setWxAccountId(wx_id);
							keywordsModel.setRuleId(accountReplyRoleModel.getId());
							keywordsModel.setType(type);
							keywordsModel.setMatchMode(match_mode);
							keywordsModel.setContent(content);
							keywordsModel.setCreateTime(new Date());
							wxAccountReplyKeywordsService.insert(keywordsModel);
						}
					}
					// 回复内容列表
					JSONArray reply_list_info = object.getJSONArray("reply_list_info");
					if (reply_list_info != null) {
						for (Object item1 : reply_list_info) {
							JSONObject reply = (JSONObject) item1;
							// 自动回复的类型。关注后自动回复和消息自动回复的类型仅支持文本（text）、图片（img）、语音（voice）、视频（video），关键词自动回复则还多了图文消息（news）
							String type = reply.getString("type");
							// 对于文本类型，content是文本内容，对于图文、图片、语音、视频类型，content是mediaID
							String content = reply.getString("content");
							// 插入自动回复消息内容
							WxAccountReplyMsgModel msgModel = new WxAccountReplyMsgModel();
							msgModel.setWxAccountId(wx_id);
							msgModel.setRuleId(accountReplyRoleModel.getId());
							msgModel.setType(3);
							msgModel.setMsgType(type);
							msgModel.setContent(content);
							msgModel.setCreateTime(new Date());
							// 图文消息
							if (type.equals("news")) {
								JSONObject news_info = reply.getJSONObject("news_info");
								JSONArray news_list = news_info.getJSONArray("list");
								for (Object item2 : news_list) {
									JSONObject news = (JSONObject) item2;
									// 图文消息的标题
									String title = news.getString("title");
									// 作者
									String author = news.getString("author");
									// 摘要
									String digest = news.getString("digest");
									// 封面图片的URL
									String cover_url = news.getString("cover_url");
									// 正文的URL
									String content_url = news.getString("content_url");
									// 原文的URL，若置空则无查看原文入口
									String source_url = news.getString("source_url");
									WxAccountReplyMsgModel msgPtModel = null;
									try {
										msgPtModel = msgModel.clone();
									} catch (CloneNotSupportedException e) {
										logger.error("复制对象失败",e);
									}
									msgPtModel.setWxAccountId(wx_id);
									msgPtModel.setTitle(title);
									msgPtModel.setAuthor(author);
									msgPtModel.setDescription(digest);
									msgPtModel.setPicurl(cover_url);
									msgPtModel.setUrl(content_url);
									msgPtModel.setSourceUrl(source_url);
									msgPtModel.setCreateTime(new Date());
									wxAccountReplyMsgService.insert(msgPtModel);
								}
							}else{
								wxAccountReplyMsgService.insert(msgModel);
							}
						}
					}
				}
			}

		}
		// 消息自动回复是否开启，0代表未开启，1代表开启
		Integer is_autoreply_open = autoMsg.getInteger("is_autoreply_open");
		return is_autoreply_open;
	}
}
